package logic

import (
	"bluebell/dao/mysql"
	"bluebell/models"
	"math"
	"time"

	"go.uber.org/zap"
)

// GetPostStats 根据帖子ID获取统计信息
func GetPostStats(postID int64) (*models.PostStats, error) {
	return mysql.GetPostStats(postID)
}

// 记录帖子浏览
func RecordPostView(postID int64) {
	if err := mysql.IncrementViewCount(postID); err != nil {
		zap.L().Error("记录浏览量失败",
			zap.Int64("postID", postID),
			zap.Error(err))
	}
}

// 记录帖子点赞
func RecordPostLike(postID int64) {
	if err := mysql.IncrementLikeCount(postID); err != nil {
		zap.L().Error("记录点赞量失败",
			zap.Int64("postID", postID),
			zap.Error(err))
	}
}

// 记录帖子收藏
func RecordPostCollect(postID int64) {
	if err := mysql.IncrementCollectCount(postID); err != nil {
		zap.L().Error("记录收藏量失败",
			zap.Int64("postID", postID),
			zap.Error(err))
	}
}

// 记录评论操作
func RecordCommentCreation(postID int64) {
	if err := mysql.IncrementCommentCount(postID); err != nil {
		zap.L().Error("记录评论量失败",
			zap.Int64("postID", postID),
			zap.Error(err))
	}
}

// 获取最近有评论的热门帖子

// 初始化新帖子的统计记录
func InitPostStatistics(postID int64) {
	if err := mysql.InitPostStats(postID); err != nil {
		zap.L().Error("初始化帖子统计失败",
			zap.Int64("postID", postID),
			zap.Error(err))
	}
}

// 计算帖子的活跃度分数
func CalculatePostActivityScore(stats *models.PostStats) float64 {
	const (
		viewWeight    = 0.1
		likeWeight    = 0.3
		collectWeight = 0.3
		commentWeight = 0.3
	)

	now := time.Now()

	// 时间衰减因子 (1.0 表示当前，每过一周减半)
	timeFactor := 1.0
	if !stats.LastCommentedAt.IsZero() {
		days := now.Sub(stats.LastCommentedAt).Hours() / 24
		if days > 0 {
			timeFactor = 1.0 - math.Min(1.0, days/7)*0.5
		}
	}

	// 基本分数
	baseScore :=
		float64(stats.ViewCount)*viewWeight +
			float64(stats.LikeCount)*likeWeight +
			float64(stats.CollectCount)*collectWeight +
			float64(stats.CommentCount)*commentWeight

	// 应用时间衰减
	return baseScore * timeFactor
}
